<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .a {
            width: 50px;
            height: 50px;
            background-color: #f00;
            position: absolute;
        }
    </style>
</head>

<body>

    <div class="a"></div>


    <script>

        var oDiv = document.querySelector('.a');

        move(oDiv, 40, 1000, 'left')


        // function move(ele, speed, end, prop, cb) {
        //     // 获取开始的位置
        //     var cur = parseInt(getComputedStyle(ele)[prop]);
        //     // 确定速度
        //     speed = end > cur ? speed : -speed;
        //     t = setInterval(function () {
        //         // 匀加速
        //         speed++;
        //         cur += speed;
        //         ele.style[prop] = cur + 'px';
        //         if (Math.abs(end - cur) <= Math.abs(speed)) {
        //             clearInterval(t);
        //             ele.style[prop] = end + 'px';
        //             cb && cb()
        //         }
        //     }, 20)
        // }



        // 减速运动需要注意速度可能变成反方向

        function move(ele, speed, end, prop, cb) {
            // 获取开始的位置
            var cur = parseInt(getComputedStyle(ele)[prop]);
            // 确定速度
            speed = end > cur ? speed : -speed;
            t = setInterval(function () {
                // 匀减
                speed--;
                // 可能由正数变成负数
                speed = speed < 1 ? 1 : speed;
                cur += speed;
                ele.style[prop] = cur + 'px';
                if (Math.abs(end - cur) <= Math.abs(speed)) {
                    clearInterval(t);
                    ele.style[prop] = end + 'px';
                    cb && cb()
                }
            }, 20)
        }

    </script>

</body>

</html>